package marina;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

import marina.model.SungJuk2VO;

public class J22SungJuk {
	// 성적처리를 JDBC로 구현
	// 오라클 데이터 베이스를 이용해서 성적 데이터 저장, 조회, 수정, 삭제를 처리

	// JDBC 객체 및 연결 정보
	private static String DRV = "oracle.jdbc.driver.OracleDriver";
	private static String URL = "jdbc:oracle:thin:@112.216.253.124:1521:xe";
	private static String USR = "marina33";
	private static String PWD = "marina33";

	public static void main(String[] args) {
		Scanner sc = null;
		String result = "";
		while (true) {
			System.out.println("JDBC 성적 처리 프로그램");
			System.out.println("============================================");
			System.out.println("1: 새로운 성적 데이터 추가");
			System.out.println("2: 전체 성적 데이터 출력");
			System.out.println("3: 성적 데이터 조회");
			System.out.println("4: 성적 데이터 수정");
			System.out.println("5: 성적 데이터 삭제");
			System.out.println("0: 성적 프로그램 종료");
			System.out.println("============================================");
			System.out.print("실행할 작업을 선택하세요.");
			sc = new Scanner(System.in);
			switch (sc.nextInt()) {
			case 1:
				result = newSungJuk();
				break;
			case 2:
				result = readSungJuk();
				break;
			case 3:
				result = readOneSungJuk();
				break;
			case 4:
				result = modifySungJuk();
				break;
			case 5:
				result = removeSungJuk();
				break;
			case 0:
				sc.close();
				System.out.println("프로그램이 안전하게 종료되었습니다.");
				System.exit(0);
				break;
			default:
				result = "잘못 입력하셨습니다.";
			}
			System.out.println(result);
		}

	}// main
		// /성적 데이터 입력

	public static String newSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String result = "";
		Scanner sc = new Scanner(System.in);
		String sql = " insert into sungjuk( sjno, name, kor, eng, mat, tot, avg, grd )values (sjno.nextval,?,?,?,?,?,?,?) ";
		System.out.println("성적 데이터를 입력합니다.");
		System.out.println("이름, 국어, 영어, 수학 순으로 입력하세요.");
		SungJuk2VO sj = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(),
				sc.nextInt());
		// 총점, 평균, 학점 계산
		computeSungJuk(sj);
		// sungjuk 테이블에 데이터 입력
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, sj.getName());
			pstmt.setInt(2, sj.getKor());
			pstmt.setInt(3, sj.getEng());
			pstmt.setInt(4, sj.getMat());
			pstmt.setInt(5, sj.getTot());
			pstmt.setDouble(6, sj.getAvg());
			pstmt.setString(7, String.valueOf(sj.getGrd())); // 어떤 값이던 문자열로 바꿔줌
																// String.valueOf
			int cnt = pstmt.executeUpdate();
			if (cnt > 0) {
				result = cnt + "건의 데이터가 입력됨.";
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	// /성적 데이터 전체 조회
	public static String readSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; // select문 실행 시에만 ResultSet이 필요하다.
		String sql = " select * from sungjuk "; // 쿼리문 앞뒤로 빈칸 넣어주는 게 좋다.
		sql += " order by sjno "; // 게시판의 경우 내림차순(역순으로) 정렬한다. 최근 쓴 글이 앞에 보여야
									// 되니까..
		StringBuilder sb = new StringBuilder();
		System.out.println("전체 성적 데이터를 출력합니다.");
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql); // SQL문 생성
			rs = pstmt.executeQuery();
			while (rs.next()) {
				sb.append(rs.getString(1)).append("/").append(rs.getString(2))
						.append("/").append(rs.getString(3)).append("/")
						.append(rs.getString(4)).append("/")
						.append(rs.getString(5)).append("/")
						.append(rs.getString(6)).append("/")
						.append(rs.getString(7)).append("/")
						.append(rs.getString(8)).append("/")
						.append(rs.getString(9)).append("\n");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (Exception e) {
				}
			}
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e) {
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
				}
			}
		}
		return sb.toString();
	}

	// /성적 데이터 검색
	public static String readOneSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = " select * from sungjuk ";
		sql += " where name = ? order by sjno ";
		StringBuilder sb = new StringBuilder();
		Scanner sc = new Scanner(System.in);
		System.out.println("이름으로 성적 데이터를 조회합니다.");
		System.out.println("조회할 성적 데이터의 이름을 입력하세요.");
		String name = sc.next();
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, name); // sql에 물음표가 있으면 얘가 따라온다.
			rs = pstmt.executeQuery();
			sb.append("=====================================").append("\n");
			while (rs.next()) {
				sb.append(rs.getString(1)).append("/").append(rs.getString(2))
						.append("/").append(rs.getString(3)).append("/")
						.append(rs.getString(4)).append("/")
						.append(rs.getString(5)).append("/")
						.append(rs.getString(6)).append("/")
						.append(rs.getString(7)).append("/")
						.append(rs.getString(8)).append("/")
						.append(rs.getString(9)).append("\n");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (rs != null) {
				try {
					rs.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return sb.toString();
	}

	// /성적 데이터 수정
	public static String modifySungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = " update sungjuk set name = ?,kor = ?,eng = ?,mat = ?,tot = ?,avg = ?,grd = ?,regdate=sysdate where name = ? ";
		Scanner sc = new Scanner(System.in);
		String result = "";
		System.out.println("기존 성적 데이터를 수정합니다.");
		System.out.println("수정할 데이터의 이름을 입력하세요.");
		String name = sc.next();
		System.out.println("이름 국어 영어 수학 순으로 입력하세요.");
		SungJuk2VO sj = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt());
		computeSungJuk(sj);
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, sj.getName());
			pstmt.setInt(2, sj.getKor());
			pstmt.setInt(3, sj.getEng());
			pstmt.setInt(4, sj.getMat());
			pstmt.setInt(5, sj.getTot());
			pstmt.setDouble(6, sj.getAvg());
			pstmt.setString(7, String.valueOf(sj.getGrd()));
			pstmt.setString(8, name);
			int cnt = pstmt.executeUpdate();
			if(cnt > 0){
				result = cnt + "건의 데이터가 수정되었습니다.";
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null){
				try {
					pstmt.close();
				} catch(Exception e) {
					e.printStackTrace();
				}
			}
			if(conn != null){
				try {
					conn.close();
				} catch(Exception e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	// /성적 데이터 삭제
	public static String removeSungJuk() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = " Delete from sungjuk where name = ? ";
		Scanner sc = new Scanner(System.in);
		System.out.println("선택한 성적 데이터를 삭제합니다.");
		System.out.println("삭제할 성적 데이터의 이름을 입력하세요.");
		String name = sc.next();
		try {
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL, USR, PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, name);
			int cnt = pstmt.executeUpdate();
			if (cnt > 0) {
				System.out.println(cnt + "건의 데이터가 삭제되었습니다.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		String result = "";
		return result;
	}

	// 성적 데이터 계산
	public static void computeSungJuk(SungJuk2VO sj) {
		sj.setTot(sj.getKor() + sj.getEng() + sj.getMat());
		String dfmt = "###.##";
		DecimalFormat df = new DecimalFormat(dfmt);
		String avg = df.format((double) sj.getTot() / 3);
		sj.setAvg(Double.parseDouble(avg));
		switch ((int) sj.getAvg() / 10) {
		case 10:
		case 9:
			sj.setGrd('수');
			break;
		case 8:
			sj.setGrd('우');
			break;
		case 7:
			sj.setGrd('미');
			break;
		case 6:
			sj.setGrd('양');
			break;
		default:
			sj.setGrd('가');
		}
	}
}// class
